package Homework;

import java.util.ArrayList;
import java.util.HashMap;

// 2. 使用 hashMap 集合求解: 求男女武将各有多少人,无需遍历map,直接打印map即可
// 3. 使用 hashMap 集合求解: 各个地区分别有多少名武将,无需遍历map,直接打印map即可
// 4. 使用 hashMap 集合求解: 各个年龄段分别有多少名武将,年龄段有
        /*
        	[0,10)
        	[10,20)
        	[20,30)
        	[30,40)
        	[40,50)
        	[50,60)
        	[60,∞)
        */
public class MyHeroAnswer {
    public static void main(String[] args) {
        String data = "1\t阿会喃\t云南\t男\t190\t225\t74\n" +
                "2\t伊籍\t江陵\t男\t162\t226\t24\n" +
                "3\t尹赏\t天水\t男\t194\t260\t44\n" +
                "4\t尹默\t梓潼\t男\t183\t239\t15\n" +
                "5\t于禁\t陈留\t男\t159\t221\t78\n" +
                "6\t卫瓘\t晋阳\t男\t220\t291\t46\n" +
                "7\t袁胤\t汝南\t男\t163\t199\t14\n" +
                "8\t袁熙\t汝南\t男\t176\t207\t51\n" +
                "9\t阎行\t长安\t男\t159\t222\t84\n" +
                "10\t阎柔\t北平\t男\t168\t227\t57\n" +
                "11\t袁术\t宛\t男\t155\t199\t65\n" +
                "12\t袁尚\t汝南\t男\t179\t207\t75\n" +
                "13\t袁绍\t南皮\t男\t154\t202\t69\n" +
                "14\t阎象\t宛\t男\t158\t199\t27\n" +
                "15\t袁谭\t汝南\t男\t173\t205\t69\n" +
                "16\t阎圃\t汉中\t男\t163\t231\t25\n" +
                "17\t王威\t襄阳\t男\t163\t208\t70\n" +
                "18\t王允\t洛阳\t男\t137\t192\t6\n" +
                "19\t王伉\t成都\t男\t184\t254\t60\n" +
                "20\t王粲\t邺\t男\t177\t217\t3\n" +
                "21\t王修\t北海\t男\t168\t218\t27\n" +
                "22\t王肃\t下邳\t男\t195\t256\t22\n" +
                "23\t邹氏\t天水\t女\t165\t197\t6\n" +
                "24\t曹节\t\t女\t190\t260\t2\n" +
                "25\t孙氏\t建业\t女\t188\t250\t22\n" +
                "26\t孙尚香\t江陵\t女\t193\t222\t86\n" +
                "27\t孙鲁育\t\t女\t204\t250\t8\n" +
                "28\t孙鲁班\t建业\t女\t202\t250\t58\n" +
                "29\t大乔\t建业\t女\t177\t210\t11\n" +
                "30\t张氏\t\t女\t207\t237\t61\n" +
                "31\t张春华\t陈留\t女\t189\t234\t49\n" +
                "32\t貂蝉\t洛阳\t女\t176\t198\t26\n" +
                "33\t樊氏\t桂阳\t女\t176\t215\t22\n" +
                "34\t糜氏\t下邳\t女\t176\t208\t6\n" +
                "35\t卞氏\t许昌\t女\t160\t230\t24\n" +
                "36\t步练师\t\t女\t185\t238\t10\n" +
                "37\t刘氏\t洛阳\t女\t164\t205\t8\n";

        //1.将数据录入集合
        //创建集合
        ArrayList<Hero> list=new ArrayList<>();
        //分割字符串
        String[] split = data.split("\n");
        //遍历数组
        for (String s : split) {
            //分割各个字符串
            String[] heroStr = s.split("\t");
            int id=Integer.parseInt(heroStr[0]);
            String name=heroStr[1];
            String location=heroStr[2];
            String sex=heroStr[3];
            int birth=Integer.parseInt(heroStr[4]);
            int death=Integer.parseInt(heroStr[5]);
            int strength=Integer.parseInt(heroStr[6]);
            //创建对象录入
            Hero hero=new Hero(id,name,location,sex,birth,death,strength);
            list.add(hero);
        }

        // 2. 使用 hashMap 集合求解: 求男女武将各有多少人,无需遍历map,直接打印map即可
        //创建集合
        HashMap<String,Integer> map=new HashMap<>();
        //遍历list集合 趁机创建Map集合
        for (Hero hero : list) {
            String sex = hero.getSex();
            if(map.containsKey(sex)){
                Integer value = map.get(sex);
                map.put(sex,value+1);//此处必须为+1;(不可为++);+1有拆箱装箱的过程
            }else{
                map.put(sex,1);
            }
        }

       /* for (Hero hero : list) {
            if("男".equals(hero.getSex())){
                if(map.get("男")==null){
                    map.put("男",1);
                }else{
                    Integer value = map.get("男");
                    value++;
                    map.put("男",value);
                }

            }else{
                if(map.get("女")==null){
                    map.put("女",1);
                }else{
                    Integer value = map.get("女");
                    value++;
                    map.put("女",value);
                }
            }
        }*/
        System.out.println("求男女武将各有多少人,无需遍历map,直接打印map即可:");
        System.out.println(map);
        /*//调用方法遍历Map集合
        //第一种:提取键值遍历
        Set<String> keys = map.keySet();
        for (String key : keys) {
            Integer value = map.get(key);
            System.out.println(key+"---"+value);
        }
        System.out.println("============");
        //第二种:提取键值遍历
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"----"+value);
        }
        System.out.println("============");
        //第三种:forEach
        map.forEach(
                (String key,Integer value)->{
                    System.out.println(key+"----"+value);
                }
        );*/
        System.out.println("===========================");

        //3. 使用 hashMap 集合求解: 各个地区分别有多少名武将,无需遍历map,直接打印map即可
        //定义HashMap 集合
        HashMap<String,Integer>map1=new HashMap<>();
        //遍历list集合为map1集合添加元素
        for (Hero hero : list) {
            String location = hero.getLocation();
            if(map1.containsKey(location)){
                Integer value = map1.get(location);
                map1.put(location,value+1);//此处必须是+1  (不能写++),  +1有拆箱装箱的过程
            }else{
                map1.put(location,1);
            }
        }
       /* for (Hero hero : list) {
            //提取地区值
            String location = hero.getLocation();
            //获取map1集合中的键的集合
            Set<String> keys1 = map1.keySet();
            //遍历键集合
            for (String key : keys1) {
                if(location==key){
                    Integer value = map1.get(key);
                    value++;
                    map1.put(key,value);
                    continue;
                }
            }
            map1.put(location,1);
        }*/
        System.out.println("各个地区分别有多少名武将,无需遍历map,直接打印map即可:");
        System.out.println(map1);
        /*//遍历map1集合
        //第一种方法 提取集合的键并进行遍历
        Set<String> keys1 = map1.keySet();
        for (String key : keys1) {
            Integer value = map1.get(key);
            System.out.println(key+"---"+value);
        }
        System.out.println("===========");
        //第二种方法 提取键值对并进行遍历
        Set<Map.Entry<String, Integer>> entries1 = map1.entrySet();
        for (Map.Entry<String, Integer> entry : entries1) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"---"+value);
        }
        System.out.println("===========");
        //第三种方法 forEach 方法
        map1.forEach((String key,Integer value)-> System.out.println(key+"---"+value));*/
        System.out.println("==========================");

        // 4.使用 hashMap 集合求解: 各个年龄段分别有多少名武将,年龄段有
        //        /*
        //        	[0,10)
        //        	[10,20)
        //        	[20,30)
        //        	[30,40)
        //        	[40,50)
        //        	[50,60)
        //        	[60,∞)
        //        */
        //创建HashMap集合
        HashMap<String,Integer>map2=new HashMap<>();
        //遍历list集合为map2集合添加元素
        for (Hero hero : list) {
            //计算年龄
            int age=hero.getDeath()-hero.getBirth();
            //通过将键设置为(年龄除以10的值),调用Math中的min方法来确认键
            int key = Math.min(age / 10, 6);
            //键转换为String形式,也可以把Map集合的参数一改
          /* String s="["+String.valueOf(key)+"0,"+String.valueOf(key+1)+"0)";
            不可以,结果不同了
            各个年龄段分别有多少名武将:
            {[40,50)=9, [50,60)=5, [20,30)=3, [60,70)=11, [30,40)=9}
            ======================*/
            String s=String.valueOf(key);
            /*各个年龄段分别有多少名武将:
            {2=3, 3=9, 4=9, 5=5, 6=11}
            ======================*/
            if(map2.containsKey(s)){
                Integer value = map2.get(s);
                map2.put(s,value+1);//此处value+1; 必须为+1,这表示有拆箱装箱的过程
            }else{
                map2.put(s,1);
            }
        }
      /*  map2.put("[0,10)",0);
        map2.put("[10,20)",0);
        map2.put("[20,30)",0);
        map2.put("[30,40)",0);
        map2.put("[40,50)",0);
        map2.put("[50,60)",0);
        map2.put("[60,∞)",0);
        //遍历list集合 为map2添加数值
        for (Hero hero : list) {
            //计算年龄值
           int age= hero.getDeath()-hero.getBirth();
           if(age<0){
               System.out.println("此武将年龄有误");
           }else{
               if(age<10){
                   Integer value = map2.get("[0,10)");
                   value++;
                   map2.put("[0,10)",value);
               }else if(age<20){
                   Integer value = map2.get("[10,20)");
                   value++;
                   map2.put("[10,20)",value);
               }else if(age<30){
                   Integer value = map2.get("[20,30)");
                   value++;
                   map2.put("[20,30)",value);
               }else if(age<40){
                   Integer value = map2.get("[30,40)");
                   value++;
                   map2.put("[30,40)",value);
               }else if(age<50){
                   Integer value = map2.get("[40,50)");
                   value++;
                   map2.put("[40,50)",value);
               }else if(age<60){
                   Integer value = map2.get("[50,60)");
                   value++;
                   map2.put("[50,60)",value);
               }else {
                   Integer value = map2.get("[60,∞)");
                   value++;
                   map2.put("[60,∞)",value);
               }
           }
        }*/
        System.out.println("各个年龄段分别有多少名武将:");
        System.out.println(map2);
       /* //遍历map2集合
        //第一种方法 提取键进行遍历
       *//* Set<String> key2 = map2.keySet();
        for (String key : key2) {
            Integer value = map.get(key);//错误
            System.out.println(key+"----"+value);
        }*//*
        Set<String> keys2 = map2.keySet();
        for (String key : keys2) {
            Integer value = map2.get(key);
            System.out.println(key+"---"+value);
        }
        System.out.println("========");
        //第二种方法 提取键值对进行遍历
        Set<Map.Entry<String, Integer>> entries2 = map2.entrySet();
        for (Map.Entry<String, Integer> entry : entries2) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(key+"---"+value);
        }
        System.out.println("========");
        //第三种方法 forEach
        map2.forEach((String key,Integer value)-> System.out.println(key+"---"+value));*/
        System.out.println("======================");
    }
    //定义方法遍历Map集合
   /* public static void getMAp(Map<Hero,In> map){


    }*/
}